package com.example.review;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import androidx.core.content.FileProvider;

import android.Manifest;
import android.annotation.SuppressLint;
import android.content.ContentResolver;
import android.content.ContentUris;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.provider.DocumentsContract;
import android.provider.MediaStore;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.Toast;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;

public class chapterEight3Activity extends AppCompatActivity {
    public static final int TAKE_PHOTO = 1;
    public static final int CHOOSE_PHOTO= 2;
    private ImageView picture;
    private Uri imageUri;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_chapter_eight3);
        Button button =findViewById(R.id.take_photo);
        picture =findViewById(R.id.picc);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                // 创建File对象，用于存储拍照后的图片     getExternalCacheDir()得到SD卡的应用关联缓存目录
                File outputImage = new File(getExternalCacheDir(), "output_image.jpg");

                try {
                    if (outputImage.exists()) {
                        outputImage.delete();
                    }
                    outputImage.createNewFile();
                } catch (IOException e) {
                    e.printStackTrace();
                }
                if (Build.VERSION.SDK_INT >= 24) {
                    //就调用FileProvider的getUriForFile() 方法将File 对象转换成一个封装过的Uri 对象
                    //三个参数 上下文 任意唯一字符串 file对象
                    imageUri = FileProvider.getUriForFile(chapterEight3Activity.this, "com.example.review.fileProvider", outputImage);
                } else {
                    //调用Uri的fromFile() 方 法将File 对象转换成Uri 对象，这个Uri对象标识着output_image.jpg这张图片的本地真实路 径
                    imageUri = Uri.fromFile(outputImage);
                }
                // 启动相机程序
                Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");
                intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
                //intent 请求码
                startActivityForResult(intent, TAKE_PHOTO);
            }
        });

        //从相册中选择照片
        Button button1 =findViewById(R.id.choose_from_album);
        button1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //申请权限
                if (ContextCompat.checkSelfPermission(chapterEight3Activity.this,
                        Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager. PERMISSION_GRANTED) {
                    ActivityCompat.requestPermissions(chapterEight3Activity.this, new String[]{ Manifest.permission. WRITE_EXTERNAL_STORAGE }, 2); }
                else {
                    openAlbum();
                }
            }
        });
    }

    @Override
    //申请权限结果回调
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        switch (requestCode){
            case 2:
                if (grantResults.length > 0 && grantResults[0] == PackageManager. PERMISSION_GRANTED) {
                    openAlbum();
                } else {
                    Toast.makeText(this, "You denied the permission", Toast.LENGTH_SHORT).show();
                }
                break;
            default:

        }
    }
    private void openAlbum() {
        Intent intent = new Intent("android.intent.action.GET_CONTENT");
        //设置数据类型为图片
        intent.setType("image/*");
        startActivityForResult(intent, CHOOSE_PHOTO); // 打开相册
         }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        switch (requestCode){
            case TAKE_PHOTO:
                if (resultCode==RESULT_OK){
                    try {
                        //将拍摄照片显示出来
                        Bitmap bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(imageUri));
                        picture.setImageBitmap(bitmap);
                    }catch (FileNotFoundException f){
                        f.printStackTrace();
                    }
                }
                break;
            case CHOOSE_PHOTO:
                if (resultCode==RESULT_OK){
                    try {
                        // 判断手机系统版本号
                        if (Build.VERSION.SDK_INT >= 19) {
                            // 4.4及以上系统使用这个方法处理图片
                            handleImageOnKitKat(data); }
                        else {
                            // 4.4以下系统使用这个方法处理图片
                            handleImageBeforeKitKat(data);
                        }
                    }catch (Exception e){
                        e.printStackTrace();
                    }
                }
            default:
                break;
        }
    }

    /**
     * 4.4及以上系统处理图片   逻辑就基本是如何解析这个封装过的Uri
     * @param data
     */
    private void handleImageOnKitKat(Intent data) {
        String imagePath = null;
        Uri uri = data.getData();
        if (DocumentsContract.isDocumentUri(this, uri)) {
            // 如果是document类型的Uri，则通过document id处理
            String docId = DocumentsContract.getDocumentId(uri);
            if("com.android.providers.media.documents".equals(uri.getAuthority())) {
                String id = docId.split(":")[1];
                // 解析出数字格式的id
                String selection = MediaStore.Images.Media._ID + "=" + id;
                imagePath = getImagePath(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, selection);
            }
            else if ("com.android.providers.downloads.documents".equals(uri. getAuthority())) {
                Uri contentUri = ContentUris.withAppendedId(Uri.parse("content: //downloads/public_downloads"), Long.valueOf(docId));
                imagePath = getImagePath(contentUri, null);
            }



        } else if ("content".equalsIgnoreCase(uri.getScheme())) {
            // 如果是content类型的Uri，则使用普通方式处理
            imagePath = getImagePath(uri, null);


        } else if ("file".equalsIgnoreCase(uri.getScheme())) {
            // 如果是file类型的Uri，直接获取图片路径即可
            imagePath = uri.getPath();
        }

        displayImage(imagePath); // 根据图片路径显示图片

    }

    /**
     * 4.4以下系统处理图片
     * @param data
     */
    private void handleImageBeforeKitKat(Intent data) {
        Uri uri = data.getData();
        String imagePath = getImagePath(uri, null);
        displayImage(imagePath);
    }

    /**
     * 获取图片路径
     * @param uri
     * @param selection
     * @return
     */
    @SuppressLint("Range")
    private String getImagePath(Uri uri, String selection) {
        String path = null;
        // 通过Uri和selection来获取真实的图片路径
        Cursor cursor = getContentResolver().query(uri, null, selection, null, null);
        if (cursor != null) {
            if (cursor.moveToFirst()) {
                path = cursor.getString(cursor.getColumnIndex(MediaStore. Images.Media.DATA));
            }
            cursor.close();
        }
        return path;
    }

    /**
     * 展示图片
     * @param imagePath
     */
    private void displayImage(String imagePath) {
        if (imagePath != null) {
            Bitmap bitmap = BitmapFactory.decodeFile(imagePath);
            picture.setImageBitmap(bitmap);
        } else {
            Toast.makeText(this, "failed to get image", Toast.LENGTH_SHORT).show();
        }
    }


/**
 * 以下是图片压缩的
 */


//    /**
//     * 计算位图的采样比例大小
//     * @param options
//     * @param imageView 控件(根据控件的大小进行压缩)
//     * @return
//     */
//    private static int calculatInSampleSize(BitmapFactory.Options options, ImageView imageView) {
//        //获取位图的原宽高
//        final int w = options.outWidth;
//        final int h = options.outHeight;
//
//        if (imageView!=null){
//            //获取控件的宽高
//            final int reqWidth = imageView.getWidth();
//            final int reqHeight = imageView.getHeight();
//
//            //默认为一(就是不压缩)
//            int inSampleSize = 1;
//            //如果原图的宽高比需要的图片宽高大
//            if (w > reqWidth || h > reqHeight) {
//                if (w > h) {
//                    inSampleSize = Math.round((float) h / (float) reqHeight);
//                } else {
//                    inSampleSize = Math.round((float) w / (float) reqWidth);
//                }
//            }
//
//            System.out.println("压缩比为:" + inSampleSize);
//
//            return inSampleSize;
//
//        }else {
//            return 1;
//        }
//    }
//
//
//
//    /**
//     * 将Uri转换成Bitmap
//     * @param context
//     * @param uri
//     * @param options
//     * @return
//     */
//    public static Bitmap decodeBitmap(Context context, Uri uri, BitmapFactory.Options options) {
//        Bitmap bitmap = null;
//
//        if (uri != null) {
//            ContentResolver cr = context.getContentResolver();
//            InputStream inputStream = null;
//            try {
//                /**
//                 * 将图片的Uri地址转换成一个输入流
//                 */
//                inputStream = cr.openInputStream(uri);
//
//                /**
//                 * 将输入流转换成Bitmap
//                 */
//                bitmap = BitmapFactory.decodeStream(inputStream, null, options);
//
//                assert inputStream != null;
//                inputStream.close();
//            } catch (Exception e) {
//                e.printStackTrace();
//            }
//        }
//        return bitmap;
//    }
//
//
//
//
//
//
//    /**
//     * 对图片进行重新采样
//     * @param context
//     * @param uri 图片的Uri地址
//     * @param imageView
//     * @return
//     */
//    public static Bitmap compressBitmap(Context context, Uri uri, ImageView imageView) {
//        BitmapFactory.Options options = new BitmapFactory.Options();
//        options.inJustDecodeBounds = false;
//        decodeBitmap(context, uri, options);
//        options = new BitmapFactory.Options();
//        options.inSampleSize = calculatInSampleSize(options, imageView);
//        Bitmap bitmap = null;
//
//        try {
//            bitmap = decodeBitmap(context, uri, options);
//        } catch (Exception e) {
//            e.printStackTrace();
//        }
//
//        return bitmap;
//    }
//


}